home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / cgazv5n5.arc / SETV.C < prev    next >
C/C++ Source or Header  |  1991-09-23  |  3KB  |  112 lines

  1. /*--- SETV.C ----------------------------- Listing 1 ----------
  2.  * Author:   John Rex
  3.  * Compiler: Borland C++ 2.0, MSC 6.00a
  4.  * Purpose:  Demonstrate use of setvbuf
  5.  * Usage:    setv infile outfile [insize [outsize]]
  6.  * Method:   Copies infile to outfile one character at a time,
  7.  *           reporting elapsed time. Infile is set to use a
  8.  *           buffer of insize bytes, while outfile uses an
  9.  *           outsize bytes buffer.
  10.  *-----------------------------------------------------------*/
  11.  
  12. #include <bios.h>   /* for timer function */
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <limits.h>
  16.  
  17. #define DEF_BUF 512
  18.  
  19. #ifdef __TURBOC__      /* Borland   */
  20. #define get_clock_ticks(x) x=biostime(0,0L)
  21. #else                  /* Microsoft */
  22. #define get_clock_ticks(x) \
  23.         _bios_timeofday(_TIME_GETCLOCK, &x)
  24. #endif
  25.  
  26. long copy ( char *infilename, char *outfilename,
  27.             size_t insize, size_t outsize )
  28. {
  29.     int  c;
  30.     long starttime, donetime;
  31.     FILE *infile, *outfile;
  32.  
  33.     /* open input file and setup its buffer */
  34.     if (( infile = fopen ( infilename, "rb" )) == NULL) {
  35.           printf ( "Can't open %s\n", infilename );
  36.           exit ( 1 );
  37.     }
  38.  
  39.     if ( setvbuf ( infile, NULL, _IOFBF, insize )) {
  40.          printf ( "Couldn't set infile buffer to %u bytes.\n",
  41.                    insize );
  42.          exit ( 1 );
  43.     }
  44.  
  45.  
  46.     /* open output file and setup its buffer */
  47.     unlink ( outfilename );
  48.     if (( outfile = fopen ( outfilename, "wb" )) == NULL ) {
  49.           printf ( "Can't open %s\n", outfilename );
  50.           exit ( 1 );
  51.     }
  52.  
  53.     if ( setvbuf ( outfile, NULL, _IOFBF, outsize )) {
  54.          printf ( "Couldn't set outfile buffer to %u bytes.\n",
  55.                    outsize );
  56.         exit ( 1 );
  57.     }
  58.  
  59.     /* do it */
  60.     get_clock_ticks(starttime);    /* get timer value */
  61.     while (( c = fgetc ( infile )) != EOF )
  62.         fputc ( c, outfile );
  63.     get_clock_ticks(donetime);
  64.     fclose ( infile );
  65.     fclose ( outfile );
  66.  
  67.     return donetime - starttime;
  68. }
  69.  
  70.  
  71. void main ( int argc, char **argv )
  72. {
  73.     size_t insize, outsize;
  74.     int    i;
  75.     long   total, average, lo, hi, elapsed;
  76.  
  77.     insize = outsize = DEF_BUF;
  78.  
  79.     if ( argc < 3 || argc > 5 ) {
  80.         printf
  81.          ( "Usage: setv infile outfile [insize [outsize]]\n" );
  82.         return;
  83.     }
  84.  
  85.     /* get buffer sizes */
  86.     if ( argc > 3 )
  87.          insize = (unsigned) atoi ( argv[3] );
  88.  
  89.     if ( argc > 4 )
  90.          outsize = (unsigned) atoi ( argv[4] );
  91.  
  92.     /* now, copy the file five times */
  93.     total = hi = 0;
  94.     lo = LONG_MAX;
  95.     for ( i = 1; ; i++ ) {
  96.         elapsed = copy ( argv[1], argv[2], insize, outsize );
  97.         if ( elapsed > hi )
  98.             hi = elapsed;
  99.         if ( elapsed < lo )
  100.             lo = elapsed;
  101.         total += elapsed;
  102.  
  103.         if ( total > 500 || i > 4 )
  104.             break;
  105.     }
  106.  
  107.     average = total / i;
  108.  
  109.     printf ( "Average of %4ld ticks (%4ld - %4ld). "
  110.              "Insize = %5u. Outsize = %5u.\n",
  111.              average, lo, hi, insize, outsize );
  112. }